/**
 * @param {number[]} numbers - 已按非递减顺序排列的整数数组
 * @param {number} target - 目标和
 * @return {number[]} - 满足条件的两个数的下标（从1开始）
 */
var twoSum = function (numbers, target) {
  // 左指针，指向数组起始位置
  let left = 0;
  // 右指针，指向数组末尾位置
  let right = numbers.length - 1;

  // 双指针遍历：左指针必须小于右指针
  while (left < right) {
    // 计算当前两指针所指元素的和
    const sum = numbers[left] + numbers[right];

    // 若和等于目标值，直接返回下标（注意题目下标从1开始）
    if (sum === target) {
      return [left + 1, right + 1];
    }
    // 若和小于目标值，说明需要更大的数，左指针右移
    else if (sum < target) {
      left++;
    }
    // 若和大于目标值，说明需要更小的数，右指针左移
    else {
      right--;
    }
  }

  // 题目保证有解，不会执行到这一步，返回空数组作为占位
  return [];
};